﻿// 版权所有 (c) 2021-2024 duanzt

using ViewFaceCore.Model;

namespace Admin.NET.Plugin.ViewFace.Service.Face.Dto;

/// <summary>
/// 人脸检测结果输出
/// </summary>
public class DetectOutput
{
    public DetectOutput()
    {
        face_list = new List<DetectFaceListItem>();
    }
    /// <summary>
    /// 检测到的图片中的人脸数量
    /// </summary>
    public int face_num { get; set; }
    /// <summary>
    /// 人脸信息列表
    /// </summary>
    public List<DetectFaceListItem> face_list { get; set; }

    /// <summary>
    /// 标注人脸框的图片base64值
    /// </summary>
    public string image_base64 { get; set; }
}


/// <summary>
/// 人脸信息列表
/// </summary>
public class DetectFaceListItem
{
    /// <summary>
    /// 人脸图片的唯一标识
    /// </summary>
    public string face_token { get; set; }
    /// <summary>
    /// 人脸在图片中的位置
    /// </summary>
    public FaceRect Location { get; set; }
    /// <summary>
    /// 人脸置信度，范围【0~1】，代表这是一张人脸的概率，0最小、1最大。其中返回0或1时，数据类型为Integer
    /// </summary>
    public float face_probability { get; set; }
    /// <summary>
    /// 检测人脸框的人脸图片base64值
    /// </summary>
    public string corp_image_base64 { get; set; }
    /// <summary>
    /// 人脸旋转角度参数
    /// </summary>
    public Angle angle { get; set; }
    /// <summary>
    /// 4个关键点位置，左眼中心、右眼中心、鼻尖、嘴中心。
    /// </summary>
    public FaceMarkPoint[] landmark { get; set; }
    /// <summary>
    /// 72个特征点位置 face_field包含landmark时返回
    /// </summary>
    public FaceMarkPoint[] landmark72 { get; set; }
    /// <summary>
    /// 年龄
    /// </summary>
    public double age { get; set; }
    /// <summary>
    /// 表情
    /// </summary>
    public Expression expression { get; set; }
    /// <summary>
    /// 性别
    /// </summary>
    public Gender gender { get; set; }
    /// <summary>
    /// 是否戴眼镜
    /// </summary>
    public Glasses glasses { get; set; }
    /// <summary>
    /// 脸型
    /// </summary>
    public Face_shape face_shape { get; set; }
    /// <summary>
    /// 人脸质量
    /// </summary>
    public Quality quality { get; set; }
}


/// <summary>
/// 人脸在图片中的位置
/// </summary>
public class Location
{
    /// <summary>
    /// 人脸区域离左边界的距离
    /// </summary>
    public int left { get; set; }
    /// <summary>
    /// 人脸区域离上边界的距离
    /// </summary>
    public int top { get; set; }
    /// <summary>
    /// 人脸区域的宽度
    /// </summary>
    public int width { get; set; }
    /// <summary>
    /// 人脸区域的高度
    /// </summary>
    public int height { get; set; }
    /// <summary>
    /// 人脸框相对于竖直方向的顺时针旋转角，[-180,180]
    /// </summary>
    public int rotation { get; set; }
}

/// <summary>
/// 人脸旋转角度参数
/// </summary>
public class Angle
{
    /// <summary>
    /// 三维旋转之左右旋转角[-90(左), 90(右)]
    /// </summary>
    public double yaw { get; set; }
    /// <summary>
    /// 三维旋转之俯仰角度[-90(上), 90(下)]
    /// </summary>
    public double pitch { get; set; }
    /// <summary>
    /// 平面内旋转角[-180(逆时针), 180(顺时针)]
    /// </summary>
    public double roll { get; set; }
}
/// <summary>
/// 特征点位置
/// </summary>
public class LandmarkItem
{
    /// <summary>
    /// X坐标
    /// </summary>
    public double x { get; set; }
    /// <summary>
    /// Y坐标
    /// </summary>
    public double y { get; set; }
}


/// <summary>
/// 表情，当 face_field包含expression时返回
/// </summary>
public class Expression
{
    /// <summary>
    /// none:不笑；smile:微笑；laugh:大笑
    /// </summary>
    public string type { get; set; }
    /// <summary>
    /// 表情置信度，范围【0~1】，0最小、1最大。
    /// </summary>
    public double probability { get; set; }
}

/// <summary>
/// 性别，face_field包含gender时返回
/// </summary>
public class Gender
{
    /// <summary>
    /// male:男性 female:女性
    /// </summary>
    public string type { get; set; }
    /// <summary>
    /// 性别置信度，范围【0~1】，0代表概率最小、1代表最大。
    /// </summary>
    public double probability { get; set; }
}

/// <summary>
/// 是否带眼镜，face_field包含glasses时返回
/// </summary>
public class Glasses
{
    /// <summary>
    /// none:无眼镜，common:普通眼镜，sun:墨镜
    /// </summary>
    public string type { get; set; }
    /// <summary>
    /// 眼镜置信度，范围【0~1】，0代表概率最小、1代表最大。
    /// </summary>
    public double probability { get; set; }
}

/// <summary>
/// 脸型，当face_field包含face_shape时返回
/// </summary>
public class Face_shape
{
    /// <summary>
    /// square: 正方形 triangle:三角形 oval: 椭圆 heart: 心形 round: 圆形
    /// </summary>
    public string type { get; set; }
    /// <summary>
    /// 置信度，范围【0~1】，代表这是人脸形状判断正确的概率，0最小、1最大。
    /// </summary>
    public double probability { get; set; }
}

/// <summary>
/// 人脸各部分遮挡的概率，范围[0~1]，0表示完整，1表示不完整
/// </summary>
public class Occlusion
{
    /// <summary>
    /// 左眼遮挡比例，[0-1] ，1表示完全遮挡
    /// </summary>
    public int left_eye { get; set; }
    /// <summary>
    /// 右眼遮挡比例，[0-1] ， 1表示完全遮挡
    /// </summary>
    public int right_eye { get; set; }
    /// <summary>
    /// 鼻子遮挡比例，[0-1] ， 1表示完全遮挡
    /// </summary>
    public int nose { get; set; }
    /// <summary>
    /// 嘴巴遮挡比例，[0-1] ， 1表示完全遮挡
    /// </summary>
    public int mouth { get; set; }
    /// <summary>
    /// 左脸颊遮挡比例，[0-1] ， 1表示完全遮挡
    /// </summary>
    public double left_cheek { get; set; }
    /// <summary>
    /// 右脸颊遮挡比例，[0-1] ， 1表示完全遮挡
    /// </summary>
    public double right_cheek { get; set; }
    /// <summary>
    /// 下巴遮挡比例，，[0-1] ， 1表示完全遮挡
    /// </summary>
    public int chin_contour { get; set; }
}

/// <summary>
/// 人脸质量信息。face_field包含quality时返回
/// </summary>
public class Quality
{
    /// <summary>
    /// 人脸各部分遮挡的概率，范围[0~1]，0表示完整，1表示不完整
    /// </summary>
    public Occlusion occlusion { get; set; }
    /// <summary>
    /// 人脸模糊程度，范围[0~1]，0表示清晰，1表示模糊
    /// </summary>
    public double blur { get; set; }
    /// <summary>
    /// 单张图片的活体得分范围[0~1]。
    /// </summary>
    public int illumination { get; set; }
    /// <summary>
    /// completeness（0或1），0为人脸溢出图像边界，1为人脸都在图像边界内
    /// </summary>
    public int completeness { get; set; }
}
